#include <iostream>
using namespace std;
#include "BlockingQueue.hpp"
#include "Task.hpp"
#include <ctime>
#include <unistd.h>
void *producter(void *args)
{
    BlockingQueue<Task> *bq = static_cast<BlockingQueue<Task> *>(args);

    // 生产者生产数据
    // 1. 获取数据 2. 产生数据
    int len = opers.size(); //+-*/%
    while (true)            // 不停获取产生数据
    {
        int x = rand() % 10 + 1; //[1,10]
        int y = rand() % 10;     //[0,9]
        char c = opers[rand() % len];
        Task t(x, y, c); // 获取数据
        bq->push(t);     // 产生数据
        cout << "producter tid is: " << pthread_self() << "  i am producter ,procude a task done! task is: " << t.getTask() << endl;
        sleep(1);
    }
    return nullptr;
}
void *consumer(void *args)
{
    BlockingQueue<Task> *bq = static_cast<BlockingQueue<Task> *>(args);
    // 消费者消费数据
    // 1. 获取数据 2.处理数据
    while (true) // 不停获取处理数据
    {
        Task t = bq->pop(); // 获取数据
        t();                // 处理数据
        cout << "consumer tid is: " << pthread_self() << "  i am a consumer, consum a task done! task is: " << t.getTask() << " , task result is: " << t.getResult() << endl;
        sleep(1);
    }
    return nullptr;
}
int main()
{
    srand(time(nullptr)); // 种一个时间种子

    BlockingQueue<Task> *bq = new BlockingQueue<Task>(); // 建立共享特定结构内存空间
    pthread_t c[3], p[5];
    // 创建生产消费者线程
    for (int i = 0; i < 3; i++)
    {
        pthread_create(c + i, nullptr, consumer, bq); // 传入特定结构内存空间
    }
    for (int i = 0; i < 5; i++)
    {
        pthread_create(p + i, nullptr, producter, bq);
    }

    // 等待线程
    for (int i = 0; i < 3; i++)
    {

        pthread_join(c[i], nullptr);
    }
    for (int i = 0; i < 5; i++)
    {
        pthread_join(p[i], nullptr);
    }

    return 0;
}